/**
 * @license
 * Copyright 2015 Google Inc. All rights reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @fileoverview Input handler for the ChipHolder autocomplete widget.
 */

goog.provide('e2e.ext.ui.panels.ChipHolderInputHandler');

goog.require('goog.events.KeyCodes');
goog.require('goog.ui.ac.InputHandler');

goog.scope(function() {
var panels = e2e.ext.ui.panels;

/**
 * Constructor for the chip holder input handler.
 * Allows to attach a callback when an autocomplete row has been selected and/or
 * user did not use an autocomplete.
 */
panels.ChipHolderInputHandler = class extends goog.ui.ac.InputHandler {
  /**
   * @param {function(string):*} onSelectCallback Callback to call when a row
   *    has been selected.
   */
  constructor(onSelectCallback) {
    super(null, null, true);
    /**
     * Callback to call when a row has been selected.
     * @type {function(string):*}
     * @private
     */
    this.onSelectCallback_ = onSelectCallback;
  }

  /** @override */
  handleKeyEvent(evt) {
    switch (evt.keyCode) {
      case goog.events.KeyCodes.TAB:
      case goog.events.KeyCodes.ENTER:
        // Cover only the case when autocomplete suggestions are not open,
        // the user typed the text and pressed TAB/ENTER.
        if (!this.getAutoComplete().isOpen() && evt.target &&
            evt.target.value && evt.target.value.length > 0) {
          evt.preventDefault();
          evt.stopPropagation();
          evt.target.focus();
          // Call the callback - this will trigger a bad chip.
          this.onSelectCallback_(evt.target.value);
          return false;
        }
    }
    return super.handleKeyEvent(evt);
  }

  /** @override */
  selectRow(row, opt_multi) {
    if (this.getActiveElement()) {
      this.setTokenText(row.toString(), opt_multi);
      this.onSelectCallback_(row.toString());
    }
    return false;
  }
};


});  // goog.scope
